31. 胶囊网络
池化的替代方案
注意,池化运算会丢失一些图像信息。这是因为为了获得更小的特征级图像表示,池化会丢弃像素信息。对于图像分类等任务来说,这没关系,但是也会造成一些问题。
以人脸识别为例。在识别人脸时,我们会注意显著特征,例如两只眼睛,一个鼻子,一张嘴。这些特征共同形成了完整的一张脸。经过训练的典型人脸识别 CNN 也应学习识别这些特征。但是将图像压缩成特征级表示法可能会出现奇怪的结果:
- 假设有一张经过 PS 的人脸图像,脸上有三只眼睛或眼睛上方有一个鼻子,特征级表示法将能够识别这些特征并依然识别出人脸!虽然这张脸是 PS 的,包含不合常规的太多特征。
与池化层相比,有一些分类方法不会丢弃空间信息,而是学习各个部分之间的关系(例如眼睛、鼻子和嘴之间的空间关系)。
学习各部分之间空间关系的一种方法是胶囊网络。
胶囊网络
胶囊网络能够从图像中检测出对象的各个部分,并表示这些部分之间的空间关系。如果对象(例如人脸)具有不同的形态和典型数量的特征(眼睛、鼻子、嘴),胶囊网络便能够识别同一对象,即使没有在训练数据里见过这些形态。
胶囊网络由父节点和子节点组成,这些节点构成了对象的完整样貌。

在上述示例中,模型能够识别叶节点中的人脸部分(眼睛、鼻子、嘴等),然后在父节点中形成更完整的人脸部分。
什么是胶囊?
胶囊实际上是节点集合,每个节点都包含关于特定部分的信息,例如宽度、方向、颜色等特性。注意,每个胶囊都输出一个向量,该向量由大小和方向组成。
- 大小 (m) = 某个部分存在的概率;值在 0 到 1 之间。
- 方向 (theta) = 某个部分的状态。
我们可以对这些输出向量执行数学运算并构建一个解析树,最终识别出由多个小部分组成的完整对象。
大小是一个特殊的属性,即使对象朝着不同的方向,大小也应该很大,如下图所示。
。](img/screen-shot-2018-11-27-at-2.48.28-pm.png)
脸朝不同方向的猫脸孔,数据来源:这篇博文。
扩展阅读
- 要详细了解胶囊网络,请参阅这篇博文。
- 要在 PyTorch 中尝试实现胶囊网络,请访问此 github 代码库。